package main

import "fmt"

/*
结构体的嵌套常用于两个结构体有相同的字段，比如人和学生都相同的字段，学生会多一些，这种情况就可以结构体的嵌套
*/
//定义一个人信息的结构体，学生也有这些信息
type person struct {
	name string
	age  int
	addr string
}

// 第一种结构体嵌套方式
type student1 struct {
	p      person //嵌套前面定义的结构体，字段名为p
	source int    //该结构体特有的字段
}

// 第二种匿名结构体的嵌套
type student2 struct {
	person //使用刚才的结构体，但不定义名称
	source int
}

type student3 struct {
	addr struct { //这也是匿名结构体嵌套的写法
		city    string
		country string
	}
	source int
}

func main() {
	/*
		一、第一种嵌套结构体的初始化及取值
	*/
	//初始化
	st := student1{
		p:      person{name: "jiang", age: 18, addr: "shanghai"},
		source: 90,
	}
	fmt.Printf("%+v\n", st)
	//获取某个字段的值
	fmt.Println(st.p.age) //当我们要获取别嵌套结构体的字段时需要带上该结构体的名称
	fmt.Println(st.p.addr)
	fmt.Println(st.source)
	/*
		一、第二种嵌套结构体的初始化及取值
	*/
	st2 := student2{
		person: person{"jiang", 18, "shanghai"}, //该写法和之前版本可能不一样，之前的可能不需要前面的person:
		source: 90,
	}
	fmt.Printf("%+v\n", st2)
	fmt.Println(st2.source) //通过匿名结构体嵌套的时候取值时写法上比较好看方便，但两种的初始化都一样，都是将另外的结构体作为一个字段
	fmt.Println(st2.name)
	fmt.Println(st2.age)
}
